package eventplanner.ejb;

import eventplanner.crawler.RSSReader;
import eventplanner.ejb.dao.EventDao;
import eventplanner.ejb.dao.FeedDao;
import eventplanner.entities.Doelgroep;
import eventplanner.entities.Feed;
import eventplanner.entities.Token;
import eventplanner.entities.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashSet;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * The method <code>doOneStartup()</code> gets run as the application is deployed. The methods in this class will insert
 * test data.
 */
@Singleton
@Startup
public class StartUp {

	private static final Logger LOG = LoggerFactory.getLogger(StartUp.class);

	@EJB
	private EventDao eventDao;

	@EJB
	private FeedDao feedDao;

	@EJB
	private RSSReader rssReader;

	@PersistenceContext
	private EntityManager em;

	@PostConstruct
	private void doOneStartup() {
		createFeeds();
		createGroups();

		User user = new User("Wouter");
		em.persist(user);

		Token schoolToken = Token.createToken();
		schoolToken.setName("School agenda");
		em.persist(schoolToken);

		Token eventToken = Token.createToken();
		eventToken.setName("Leuke evenementen");
		em.persist(eventToken);

		user = em.find(User.class, user.getId());
		schoolToken = em.find(Token.class, schoolToken.getId());
		eventToken = em.find(Token.class, eventToken.getId());

		schoolToken.setUser(user);
		eventToken.setUser(user);

		schoolToken.setTags(new HashSet<String>());
		schoolToken.getTags().addAll(Arrays.asList("ict", "Java"));

		eventToken.setTags(new HashSet<String>());
		eventToken.getTags().addAll(Arrays.asList("bier", "film", "debat"));

		schoolToken.setOrganizers(new HashSet<String>());
		schoolToken.getOrganizers().add("Institute for ICT");

		schoolToken.setTargets(new HashSet<String>());
		schoolToken.getTargets().add("Instituut voor Media");

		eventToken.setOrganizers(new HashSet<String>());
		eventToken.getOrganizers().add("Studievereniging");

		eventToken.setTargets(new HashSet<String>());
		eventToken.getTargets().add("Instituut voor Media");

		schoolToken.setFeeds(new HashSet<Feed>());
		schoolToken.getFeeds().add(em.createQuery("select f from Feed f", Feed.class).setMaxResults(1).getSingleResult());

		createEvents();

		Map<String, Object> properties = em.getProperties();
		LOG.info("Entity manager properties: {}", properties.toString());
	}

	private void createEvents() {
		Feed feed = new Feed("HU Feed", "", true);
		em.persist(feed);
		feed = em.find(Feed.class, feed.getId());

		Calendar cal = Calendar.getInstance();
		cal.add(1, Calendar.DAY_OF_YEAR);

		eventDao.createAndAddEvent(feed, "Java persistence", "Wil je leren over Java persistence? Kom hier heen!", cal.getTime(), 2, TimeUnit.HOURS, "Java");
		cal.add(1, Calendar.DAY_OF_YEAR);
		eventDao.createAndAddEvent(feed, "Java EJB", "Wil je leren over Java EJB? Kom hier heen!", cal.getTime(), 2, TimeUnit.HOURS, "Java");
		cal.add(1, Calendar.DAY_OF_YEAR);
		eventDao.createAndAddEvent(feed, "Java Transactions", "Wil je leren over Java Transactions? Kom hier heen!", cal.getTime(), 2, TimeUnit.HOURS, "Java");
		cal.add(1, Calendar.DAY_OF_YEAR);
		eventDao.createAndAddEvent(feed, "Java", "Wil je leren over Java ? Kom hier heen!", cal.getTime(), 2, TimeUnit.HOURS, "Java");

	}

	private void createGroups() {

		em.persist(new Doelgroep("HU"));
		em.persist(new Doelgroep("Instituut voor Communicatie"));
		em.persist(new Doelgroep("Instituut voor Media"));
		em.persist(new Doelgroep("Kenniscentrum Communicatie & journalistiek"));
		em.persist(new Doelgroep("Centrum voor Communicatie en Journalistiek CCJ"));
		em.persist(new Doelgroep("Instituut Theo Thijssen"));
		em.persist(new Doelgroep("Instituut Archimedes"));
		em.persist(new Doelgroep("Seminarium voor Orthopedagogiek"));
		em.persist(new Doelgroep("Instituut voor Gebaren, Taal & Dovenstudies"));
		em.persist(new Doelgroep("Kenniscentrum Educatie "));
		em.persist(new Doelgroep("Institute Business Administration"));
		em.persist(new Doelgroep("Institute Business Economics"));
		em.persist(new Doelgroep("Institute for Marketing & Commerce"));
		em.persist(new Doelgroep("Centre for Business & Management"));
		em.persist(new Doelgroep("Kenniscentrum Innovatie & Business"));
		em.persist(new Doelgroep("Kenniscentrum Innovatie van Zorgverlening "));
		em.persist(new Doelgroep("Instituut voor Bewegingsstudies"));
		em.persist(new Doelgroep("Instituut voor Paramedische Studies"));
		em.persist(new Doelgroep("Instituut voor Verpleegkundige Studies"));
		em.persist(new Doelgroep("Kenniscentrum Sociale Innovatie "));
		em.persist(new Doelgroep("Instituutvoor Social Work"));
		em.persist(new Doelgroep("Instituut voor Ecologische Pedagogiek"));
		em.persist(new Doelgroep("Instituut voor Arbeid & Organisatie"));
		em.persist(new Doelgroep("Instituutvoor Veiligheid"));
		em.persist(new Doelgroep("Instituutvoor Recht"));
		em.persist(new Doelgroep("Institute for Life Sciences & Chemistry"));
		em.persist(new Doelgroep("Institute for Engineering & Design"));
		em.persist(new Doelgroep("Instituut voor Gebouwde Omgeving"));
		em.persist(new Doelgroep("Institute for ICT"));
		em.persist(new Doelgroep("Academie voor Techniek & Innovatie"));
		em.persist(new Doelgroep("Centrum voor Natuur & Techniek"));
		em.persist(new Doelgroep("Kenniscentrum Natuur en Techniek"));
		em.persist(new Doelgroep("Stafdienst Studentzaken"));
		em.persist(new Doelgroep("Studium Generale"));
		em.persist(new Doelgroep("BPS"));
		em.persist(new Doelgroep("Bureau Inschijving"));
		em.persist(new Doelgroep("International Office"));
		em.persist(new Doelgroep("Centrum Studiekeuze"));
		em.persist(new Doelgroep("Juridischje Zaken"));
		em.persist(new Doelgroep("Student Voorzieningen"));
		em.persist(new Doelgroep("Student Service Desk"));
		em.persist(new Doelgroep("Stafdienst Onderwijs & Onderzoek"));
		em.persist(new Doelgroep("Stafdienst Marketing & Communicatie"));
		em.persist(new Doelgroep("HU Evenementen"));
		em.persist(new Doelgroep("Stafdienst Personeel & Organisatie"));
		em.persist(new Doelgroep("Bureau Talent"));
		em.persist(new Doelgroep("HR Services"));
		em.persist(new Doelgroep("Interval Sevices BV"));
		em.persist(new Doelgroep("Stafdienst Financien en Business Intelligence"));
		em.persist(new Doelgroep("SSC Finaciele administratie"));
		em.persist(new Doelgroep("Stafdienst Bedrijsvoering"));
		em.persist(new Doelgroep("Bestuursdienst"));
		em.persist(new Doelgroep("Corporate Control"));
		em.persist(new Doelgroep("Hu breed"));
		em.persist(new Doelgroep("College van Bestuur"));
		em.persist(new Doelgroep("Ombudsman"));
		em.persist(new Doelgroep("Centre for Language & Culture"));
		em.persist(new Doelgroep("Campus Recruitment"));
		em.persist(new Doelgroep("Trajectum"));
		em.persist(new Doelgroep("Studentenvereniging"));
		em.persist(new Doelgroep("Studievereniging"));
		em.persist(new Doelgroep("Personeelsvereniging"));
		em.persist(new Doelgroep("Extern partners"));
		em.persist(new Doelgroep("Extern regio"));
		em.persist(new Doelgroep("Extern landelijk"));
		em.persist(new Doelgroep("Specifieke Groep"));
		em.persist(new Doelgroep("Anders/overige"));
		em.persist(new Doelgroep("Studenten"));
		em.persist(new Doelgroep("Docenten"));
		em.persist(new Doelgroep("Ondersteuning"));

	}

	private void createFeeds() {
		feedDao.persist(new Feed("Agenda FE", "https://intranet.sharepoint.hu.nl/FE/_layouts/listfeed.aspx?List={FC92FAFF-A136-4E14-9021-3133DA04AB4F}", false));
		feedDao.persist(new Feed("Agenda IGO", "https://intranet.sharepoint.hu.nl/FNT/_layouts/listfeed.aspx?List={99417FD0-CBD7-4BEC-A0BD-EBC75B78C93B}", false));
		feedDao.persist(new Feed("Agenda FG", "https://intranet.sharepoint.hu.nl/FG/_layouts/listfeed.aspx?List={07850AB1-A4B2-41EC-99A3-7A0AE114E9B3}", false));
		feedDao.persist(new Feed("Agenda FEM", "https://intranet.sharepoint.hu.nl/FEM/_layouts/listfeed.aspx?List={51CA6D00-3515-43C1-AA45-D61E67B1964E}", false));
		feedDao.persist(new Feed("Agenda FCJ", "https://intranet.sharepoint.hu.nl/FCJ/_layouts/listfeed.aspx?List={C6B10A4E-4859-4340-974F-93A77CBBCC15}", false));
		feedDao.persist(new Feed("Agenda FMR", "https://intranet.sharepoint.hu.nl/FMR/_layouts/listfeed.aspx?List={1A543457-0A78-43A0-A023-D907ECE4D5D2}", false));
		feedDao.persist(new Feed("Agenda FNT", "https://intranet.sharepoint.hu.nl/FNT/_layouts/listfeed.aspx?List={D31AF521-CA0C-4453-9C2C-5F4E8B5A8E46}", false));
		feedDao.persist(new Feed("Agenda ICT", "https://intranet.sharepoint.hu.nl/FNT/_layouts/listfeed.aspx?List={2A96E978-8C2F-4C42-986F-EE15E50C7D32}", false));
		feedDao.persist(new Feed("Agenda Facilitaire Dienst", "https://intranet.sharepoint.hu.nl/HUA/info/Facilitaire_dienst/_layouts/listfeed.aspx?List={193B347C-1AA5-4D74-B794-2B462848FB21}", false));
		feedDao.persist(new Feed("Agenda MHU", "https://intranet.sharepoint.hu.nl/HUD/info/MZ-HU/_layouts/listfeed.aspx?List={34094B87-3F20-45EB-9897-CBBB1EEF5995}", false));

		rssReader.readFeeds();
	}
}
